查看原文
其他

Max/MSP/Jitter 教程18 - 使用已命名的矩阵

kidult00 科技无障碍 2022-11-03


Max/MSP/Jitter 教程11 - 矩阵混合
Max/MSP/Jitter 教程12 - 视频去背景合成
Max/MSP/Jitter 教程13 - 列表和矩阵
Max/MSP/Jitter 教程14 - 颜色查找表
Max/MSP/Jitter 教程15 - 剪刀和胶水
Max/MSP/Jitter 教程16 - 矩阵定位

00 翻译自 Cycling74 的 Max/MSP/Jitter 官方文档:Tutorial 16: Using Named Jitter Matrices  

https://docs.cycling74.com/max7/tutorials/jitterchapter16

本教程将学习如何使用 jit.matrix 的 name 属性将来自多个源的矩阵数据写入同一矩阵。我们还将研究如何在复制时缩放矩阵的大小,以及如何用 Max 低优先级队列来降低事件的优先级,以支持更耗时的任务。

教程 patch 分为五个彩色区域。中间(浅蓝色)区域包含两个 jit.movie 对象。loadbang 对象在 patch 打开时读取两个视频(rain.mov 和 traffic.mov)到 jit.movie

与之前的教程不同,这里的 jit.movie 使用 sendreceive 对象与 patch 的其余部分通信。名为 m1 和 m2 的 receive 对象将消息转发给两个 jit.movie  对象。然后发送它们的输出矩阵(使用 send)到 patch 其他位置名为 movie1 和 movie2 的 receive 对象。

patch 顶部的黄色区域包含驱动 patch 中 Jitter 进程的 metro


``metro`` 驱动两个消息框中的一个

点击开关启动 metro 。 patch 中的三个 jit.pwindow 开始显示图像。

优先级

metro 经过 Ggatejit.qball 到达 gatemetro 发送的 bang 由 gate 分流到两个消息框之一。最终输出矩阵(在 patch 底部的 jit.pwindow 中)将根据哪个消息框被触发而改变。

单击连接到 gate 左入口的两个消息框(1 和 2)。注意底部的 jit.pwindow 如何变化:

最终输出矩阵根据 patch 的消息顺序而变化

两个消息框都将 bang 发送到三个命名相同的 receive 对象(m1,m2 和 output)。两者的区别在于发送消息的顺序。左侧消息框(由 metro 驱动,当 gate 设置为 1 时)将第一个 bang 发送到 jit.movie (rain movie)。最后,patch 底部的 jit.matrix 收到 bang,最终矩阵被发送出去。右侧消息框(由 metro 驱动,当 gate 被设置为 2 时)调换驱动 jit.movie 的两个 bang 的顺序(左 jit.movie 先输出矩阵,然后是右边的 jit.movie)。

当查看两个 jit.movie 和最终的 jit.pwindow 之间发生了什么时,这些消息发送的顺序才有意义。

要点:如果不确定 Max patch 中发生事件的顺序,可以查看 patch 的 trace 的执行方式。在接线中设置断点就可以使用 “Auto Step” 命令逐步执行 patch ,查看它如何运行。但是这对于 metro 效果不好,因为 bang 将持续重启。先在  metro 位置添加按钮用于调试。

名字里面有什么?

一旦 jit.movie 接收到 bang,就会向下面的 send 对象输出一个矩阵,然后传递给名为 movie1 和 movie2 的 receive 对象。receive(在 patch 右侧两个相同的区域)连接到 jit.pwindow 以及两个已命名的 jit.matrix 对象:

已命名的 ``jit.matrix`` 

patch 右侧的两个 jit.matrix(以及 patch 底部 jit.pwindow 上方的 jit.matrix)都有名称。这三个对象的名称是 composite。它们共享包含在名为 composite 的矩阵中的数据。

理解了两个 jit.movie 将数据写入相同的矩阵(名称相同的两个独立的 jit.matrix),就明白为什么 bang 的顺序很重要。如果左边的 jit.movie 首先发出矩阵,它会将数据写入 composite 矩阵,然后是右边的 jit.movie,它将数据写入同一个矩阵。如果两个矩阵写入任何共同的单元格(见下文),那么最后到达的矩阵将覆盖之前单元格中的数据。

目的地维度

教程 patch 右侧的两个 jit.matrix 对象将 usedstdim 属性设置为 1。这样可以缩放由 jit.movie 发送的矩阵,以便它们只写入 composite 矩阵的某个区域。

调整标记为 x origin y origin 的数字框,缩放它所连接的两个子 patch p coords。请注意 composite 矩阵如何移动和调整 jit.movie 中两个图像的大小。

图片内的图片

p coords 包含相同的辅助 patch ,用于格式化 jit.matrix 对象的 dstdimstartdstdimend 属性。这些属性分别指定将数据复制到 composite 矩阵时的左上角和右下角坐标。usedstdim 属性告诉 jit.matrix 复制数据时使用这些属性。当 usedstdim 为 0 时,缩放输入矩阵以填充 jit.matrix 引用的整个矩阵。

写入共享矩阵之前先缩放输入矩阵

发送到子 patch 的三个数字由内部对象格式化,生成要填充的输出矩阵的左上和右下区域坐标列表。消息在输出前,用 $ 暂时替代列表中对应的数字参数。

在两个矩阵写入 composite 矩阵之后,最后一件事是发送 bang 到名为output 的 receive 对象:

最后的结果

教程 patch 底部的区域是第三个名为 jit.matrix 的对象。由 metro 发送的 bang 经过一个 trigger 对象发送 bang 到 jit.matrix(让它输出矩阵到 jit.pwindow),紧接一个 clear 消息(0),清除所有名为 composite 矩阵中的单元格。如果不清空矩阵,改变任何jit.matrixdstdimstartdstdimend 属性,可能导致残留之前输出位置的图像。

队列优先级

当 Max 运算跟不上速度时, patch 顶部的 jit.qball 对象就有了用武之地。metro (每隔 50 毫秒发出 bang)正在触发三个独立的操作(从 jit.movie 对象写入数据到两个已命名的矩阵,显示数据,清空矩阵以便重新开始)。jit.matrix 写入数据到内部矩阵(这个例子中是 composite 矩阵)并允许后续消息来插队。运行任务时,它允许其他优先级更高的 Max 事件发生。这样可以在前一操作完成之前显示矩阵(或将更多数据写入),从而引起闪烁和其他意外结果。

jit.qball 对象把消息放到 Max 低优先级队列的最后, 在那里其他消息可以被优先处理。如果 jit.qball 在所有当前任务完成之前从 metro 得到 bang,它将等到队列中其他所有任务都完成后,再发出 bang。同样,如果另一个 bang 在发出第一个 bang 之前就出现了(即如果 patch 的剩余时间需要超过 50 毫秒才能完成所有事情),第一个 bang 将被抢先(抛弃)而只发出第二个 bang。这让我们可以放心地在 Max patch 中设置极值,而不必担心事件累积过快 Max 处理不过来。

单击标记为 jit.qball bypass switchGgate 对象,让 metro 的输出绕过 jit.qball 。底部 jit.pwindow 中的合成图像开始闪烁,表示消息乱序到达。

通常,发送 bang 到 Jitter 对象将插到已经挂起的事件(例如已经到达但尚未被处理的 bang)前面。不过 jit.qball 提供了对多个 Jitter 对象链的控制,自动调度事件(dropframing)保证消息以正确的顺序到达。

注:在大多数应用中 Qball已被 qmetro 取代。 qmetro 是内置 qball 机制的 metro 对象。

小结

命名多个 jit.matrix 为同一个名称,可以在 patch 的不同部分中写入和读取矩阵数据。使用 dstdimstart 和 dstdimend 属性,或者设定 usedstdim 属性为 1,可以在将其复制到 jit.matrix 内部时缩放矩阵。jit.qball 对象把 Max 事件放到低优先队列中来降低优先级,如果没有足够资源来执行,则优先处理其他事件。




Max/MSP/Jitter 教程系列

Max/MSP/Jitter 教程 01 - 什么是矩阵?
Max/MSP/Jitter 教程 02 - Jitter 对象的属性
Max/MSP/Jitter 教程 03 - 播放 QuickTime 视频
Max/MSP/Jitter 教程 04 - 创建矩阵
Max/MSP/Jitter 教程 05 - 矩阵的数学运算
Max/MSP/Jitter 教程 06 - 控制视频播放
Max/MSP/Jitter 教程 07 - ARGB 颜色
Max/MSP/Jitter 教程 08 - 调整颜色
Max/MSP/Jitter 教程 09 - 调整图像颜色
Max/MSP/Jitter 教程 10 - 交叉渐变

友情提示:独自折腾 Max 易患上癔症……不妨入群互助

👇👇👇

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存